import numpy as np
import cv2
import gradio as gr
from sklearn.cluster import KMeans

def rgb_to_hex(rgb):
    # 将RGB格式的颜色转换为十六进制表示
    return '#{:02x}{:02x}{:02x}'.format(int(rgb[0]), int(rgb[1]), int(rgb[2]))

def analyze_image_for_palette(image):
    # 将图像从BGR格式转换为RGB格式
    img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    img_copy = img.copy()
    # 将图像数据转换为二维数组，每行表示一个像素的RGB值
    X = img_copy.reshape((-1, 3))
    # 使用K均值聚类算法提取主要颜色
    kmeans = KMeans(n_clusters=5, random_state=0, n_init=10)
    y = kmeans.fit_predict(X)
    centers = kmeans.cluster_centers_
    # 将中心点的RGB值转换为十六进制表示形式
    hex_colors = [rgb_to_hex(center) for center in centers]
    # 创建一个空白图像，用于绘制主色调调色板
    palette = np.zeros((200, 1000, 3), dtype=np.uint8)
    # 在调色板中绘制每个颜色的矩形
    for i, color in enumerate(hex_colors):
        palette[:, i * 200:(i + 1)*200, :]= np.array([int(color[1:3], 16), int(color[3:5], 16),int(color[5:7], 16)])
    return palette, hex_colors
# 创建Gradio界面
iface_palette_analyzer = gr.Interface(
    fn=analyze_image_for_palette,
    inputs=gr.Image(),  # 图像输入
    outputs=[gr.Image(label="调色板"), gr.Text(label="16进制颜色")]  # 显示调色板和颜色
)
# 运行Gradio应用程序
iface_palette_analyzer.launch()
